<?php

namespace app\common\model\czip;
//获取系统变量的访客IP
use Exception;

class IpKu
{

    public static function getClientIp()
    {
        global $ip_v4, $ip_v6, $net_lan;

        // 定义 HTTP 头列表
        $headers = ['REMOTE_ADDR', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED'];

        // 遍历 HTTP 头列表
        foreach ($headers as $header) {
            // 检查 HTTP 头是否存在
            if (!isset($_SERVER[$header])) {
                continue;
            }

            // 解析 IP 地址列表
            $ips = explode(',', $_SERVER[$header]);
            foreach ($ips as $ip) {
                $ip = trim($ip); // 去除空格

                // 检查 IP 地址是否有效
                if (!filter_var($ip, FILTER_VALIDATE_IP)) {
                    continue;
                }

                // 检查 IP 地址是否为私有网络地址
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    $last_non_private_ip = $ip;
                }

                $ipaddress = $ip;
            }
        }

        // 如果找到了最后一个非私有 IP 地址，则使用该地址
        if (isset($last_non_private_ip)) {
            $ipaddress = $last_non_private_ip;
        }

        // 设置变量，根据 IP 地址类型
        $ip_v4 = filter_var($ipaddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
        $ip_v6 = filter_var($ipaddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);

        // 设置变量，如果 IP 地址属于私有网络，则为 true
        $net_lan = !filter_var($ipaddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);

        // 如果无法找到有效的 IP 地址，则返回错误
        if (empty($ipaddress)) {
            throw new Exception('无法获取客户端 IP 地址');
        }

        return $ipaddress;
    }
}

